package ChainOfResponsibility;

public abstract class AbstractLogger {

    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;


    protected int level;
    // 不同级别的记录器

    protected AbstractLogger nextLogger;
    // 责任链中下一个元素

    /*
        具有protected访问控制级别的成员是半公开的, 外界无法直接访问这个控制级别的成员,但是派生类的base指针可以获得访问能力.( c++中 也可以用 引用访问 )
        继承的类可以访问 protected 成员, 但是不能访问 private 成员. ( 跨包之后也是不可以的 )
     */

    // 设置当前 abstractLogger的 下一个 logger
    public void setNextLogger(AbstractLogger nextLogger){
        this.nextLogger = nextLogger;
    }

    public void logMessage(int level, String message){
        if ( this.level <= level){ // 当处理器的级别 高于 现在处理器的等级时, 不执行 "子对象"的 write()方法
            // this.level , this就是当前谁调用的这个 logMessage() 方法的那个对象
            write(message);
        }

        if (nextLogger != null){
            nextLogger.logMessage(level, message);  // 如果还有下一个logger,则传递给下一个对象
        }
    }

    abstract protected void write(String message);

}
